Estoy ejecutando Terraform 0.12.24 localmente
Estoy tratando de implementar una integración de API Gateway con Lambda
Estoy intentando habilitar AWS API GW CORS con Terraform.
Tengo el siguiente recurso para la respuesta del método OPTIONS:
resource "aws_api_gateway_method_response" "options_200" { rest_api_id = aws_api_gateway_rest_api.scout-approve-api-gateway.id resource_id = aws_api_gateway_resource.proxy.id http_method = aws_api_gateway_method.options_method.http_method status_code = "200" response_models { "application/json" = "Empty" } response_parameters { "method.response.header.Access-Control-Allow-Headers" = true, "method.response.header.Access-Control-Allow-Methods" = true, "method.response.header.Access-Control-Allow-Origin" = true } depends_on = [aws_api_gateway_method.options_method] }Y estoy obteniendo:
Error: Invalid argument name on main.tf line 48, in resource "aws_api_gateway_method_response" "options_200": 48: "application/json" = "Empty" Argument names must not be quoted.¿Lo que da?
Este es en realidad el malentendido del analizador donde está el error. En realidad, se queja de que está tratando de leer los modelos de response_models y los parámetros de response_parameters como bloques en lugar de atributos. Hay más discusión sobre esto en la documentación 0.12 .
La principal diferencia entre un atributo de mapa y un bloque anidado es que un atributo de mapa generalmente tendrá claves definidas por el usuario, como vemos en el ejemplo de etiquetas anterior, mientras que un bloque anidado siempre tiene un conjunto fijo de argumentos admitidos definidos por el tipo de recurso. esquema, que Terraform validará.
En la versión 0.11, podría usar indistintamente la sintaxis de bloque (solo llaves como response_parameters { ... } ) para los atributos, pero en la versión 0.12 es más estricta con respecto a los tipos, por lo que ya no es posible. El código en la publicación de Medium a la que se vinculó como ejemplo de trabajo es un código 0.11 y no es válido en 0.12. Si observa detenidamente el código de GitHub que también vinculó , puede ver que usa la sintaxis de atributo en lugar de la sintaxis de bloque, por lo que es válido.
Cambiar a usar la sintaxis de atributo agregando un = hará que esto funcione como se esperaba:
resource "aws_api_gateway_method_response" "options_200" { rest_api_id = aws_api_gateway_rest_api.scout-approve-api-gateway.id resource_id = aws_api_gateway_resource.proxy.id http_method = aws_api_gateway_method.options_method.http_method status_code = "200" response_models = { "application/json" = "Empty" } response_parameters = { "method.response.header.Access-Control-Allow-Headers" = true, "method.response.header.Access-Control-Allow-Methods" = true, "method.response.header.Access-Control-Allow-Origin" = true } depends_on = [aws_api_gateway_method.options_method] }